package com.itheima.service.impl;

import com.itheima.mapper.DeptMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.Dept;
import com.itheima.pojo.DeptLog;
import com.itheima.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/*
* @Transactional  ----  标注哪些方法开启事务
*       写在方法上：当前方法有效
*       写在类上：类上面的所有方法都加上事务
*       卸载接口上：所有的实现类的方法都有效（可读性差）
*
*   其实对于开启事务得作用就是，你写的方法抛出异常，然后不能实现功能，前端数据没有相应
* ，一般不开启事务的话就会出现没有任何反应，但是一旦开启事务就会出现提示以及方法退回，后台数据也不会有任何变化
* 简单点就是撤回----通过@Transactional就开启了
*
*
* */
@Service
//下面这个就是开启日志
@Transactional
//现在就是需要接入高级事务里面的一些组件(rolllbackfor)

/*
    1)改造方法 抛出异常
        if(true){
             throw new Exception("大异常”);
    2)方法上加上抛出异常
    3)子类不能比父类抛出更多的异常,所以 接口应该事务高级特性
@Transactional:
    1)默认只回滚 RuntimeException 及其子异常
    2)可以通过 rollbackFor 属性扩大回滚的异常

* 高级事务里面的一些新的特性（rollbackfor=Exception.class）
* 其实加入这个新的特新目的在于扩大回滚的异常范围大小
*
* 对于注解@Transactional的问题在于
*           默认的回滚，RuntimeException以及子异常
* */

public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

    @Autowired
   private EmpMapper empMapper;

    //现在引入Log日志
    @Autowired
    private DeptLogServiceImpl deptLogService;

    @Override
    public List<Dept> list() {
        return deptMapper.list();
    }

    @Override
    //在这里记住，servlet里面抛出异常，它的接口以及Mapper类里面的方法都会抛出异常
    @Transactional(rollbackFor = Exception.class)
    //这个异常回滚的范围会变大很多
    public void delete(Integer id) throws Exception {


        try {
            //删除部门--根据id删除部门数据

            //try-catch语句是一种用于捕获和处理异常的编程语句。它的作用是在程序运行时检测错误，并采取相
            //应的措施来处理这些错误，以保证程序的正常运行
            deptMapper.deleteById(id);
            //现在这里就是故意出错，等待报错
            int a = 1/0;
            //正常情况下在这里就是一个报错，按照正常情况下面的语句不会执行
            //但是现在就是加上try()catch{}语句，就会跳过去

            //这里就是根据id删除员工数据
            empMapper.deleteByDeptid(id);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //现在这里就是记录日志
            //创建对象--
            DeptLog deptLog = new DeptLog();
            //记录日志当前时间
            deptLog.setCreateTime(LocalDateTime.now());
            //下面的方法就是注释解释，没有任何意义
            deptLog.setDescription("执行了解散部门的操作，此次解散的是"+id+"号部门");
            //喜爱你在就是开始把日志写入进去（insert方法）
            //现在就是将depLogservlet方法在这个实现类里面引入SpringIOC里面创建对象
            deptLogService.insert(deptLog);
        }
        //改造出现异常
     /*   //现在模拟未来这里出现一些校验逻辑，如果校验失败，就会抛出异常
        if(true){
            throw new Exception("大异常");
        }
        //删除员工
        empMapper.deleteByDeptid(id);
*/
    }
    @Override
    public void add(Dept dept) {
        dept.setCreateTime(LocalDateTime.now());
        dept.setUpdateTime(LocalDateTime.now());

        deptMapper.insert(dept);
    }
}
